module nazo.factory;
import nazo.common_type;

/**
 * 文字列からクラスを生成します。
 */
class Factory(Classes...){
  /**
   * 文字列からサービスを取得します。
   * 見付からなければnullを返します。
   */
  static CommonType!(Classes) createObject(TL...)(string id, TL tl){
    switch(id){
      foreach(Class;Classes){
        case Class.id:
          return new Class(tl);
      }
      default:
    }
    return null;
  }
  /**
   * サポートされているidの一覧を返します。
   */
  static string[] supportedIDs(){
    string[] rv;
    foreach(Class;Classes){
      rv~=Class.id;
    }
    return rv;
  }
}

/**
 * インデックスからクラスを生成します。
 */
class ListFactory(Classes...){
  /**
   * インデックスからクラスを生成します。
   * 見付からなければnullを返します。
   */
  static CommonType!(Classes) create(TL...)(uint i, TL tl){
    switch(i){
      foreach(n,Class;Classes){
        case n:
          return new Class(tl);
      }
      default:
    }
    return null;
  }
  /**
   * クラスの一覧を返します。
   */
  static CommonType!(Classes)[] items(){
    typeof(return) rv;
    foreach(Class;Classes){
      rv~=new Class;
    }
    return rv;
  }
}

/*import std.stdio;

class Base{}
class A:Base{const string id="a";}
class B:Base{const string id="b";}
class C:Base{const string id="c";}

void main(){
  auto factory = new Factory!(A,B,C);
  writefln(typeid(typeof(factory.createObject("a"))));
}*/
